// 端口
let port = 3000

const express = require('express')
const app = express()

const cors = require('cors')    // 解决跨域问题
app.use(cors())

// 处理前端页面传过来的请求数据
const bodyParser = require('body-parser')
// const multiparty = require('connect-multiparty')

app.use(bodyParser.urlencoded({extended: true}))    // 处理 x-www-form-urlencoded 

// app.use(multiparty())   // 处理 mutipart/form-data

app.use(bodyParser.json())  // 处理 application/json


/**
 * token验证
 * npm i jsonwebtoken -D-S
 * npm i express-jwt -D-S
 */

const expressJWT = require('express-jwt')
const secretKey = 'minghuashe'  // token加密关键字

// 配置expressJwt中间件
app.use(
    expressJWT.expressjwt({ secret: secretKey, algorithms: ["HS256"] }).unless({
        path: [
            '/api/login',
            '/api/logout',
            '/api/register',
            '/api/classcountry',
            '/api/classpainter',
            '/api/classstyle',
            '/api/classtheme',
            '/api/indexBanner',
            '/api/indexArtExhibition1',
            '/api/indexHotShow1',
            '/api/indexHotShow2',
        ],
    })
);

const { Sequelize } = require('sequelize');
const Op = Sequelize.Op;

// 初始化 Sequelize
const sequelize = new Sequelize('chen', 'root', '123456', {
    host: 'localhost',
    port: 3306,
    dialect: 'mysql',
});

// Sequelize验证连接数据库是否正常
async function testConnection() {
    try {
        await sequelize.authenticate();
        console.log('数据库连接正常.');
    } catch (error) {
        console.error('数据库连接失败:', error);
    }
}
testConnection();

// 自动创建表和结构
// force 选项设置为 false，这意味着如果数据库表已经存在，它将不会重新创建，而是保留现有的表结构。如果你想每次重新创建表，可以将 force 选项设置为 true，但请注意这将删除所有表中的数据。
// sequelize.sync({ force: true }).then(() => {
//     console.log('comment数据表创建已经成功');
// }).catch((error) => {
//     console.error('创建失败：', error);
// });

// 创建模板
const Comment = sequelize.define('Comment', {
    // 评论的唯一标识符
    id: {
        type: Sequelize.INTEGER,
        allowNull: false,
        primaryKey: true,
        autoIncrement: true,
        comment: '评论的唯一标识符'
    },
    // 评论的内容
    content: {
        type: Sequelize.STRING(1000),
        allowNull: false,
        comment: '评论的内容'
    },
    // 评论的作者
    author: {
        type: Sequelize.STRING(50),
        allowNull: false,
        comment: '评论的作者'
    },
    // 评论的所属文章
    articleId: {
        type: Sequelize.INTEGER,
        allowNull: false,
        comment: '评论的所属文章的唯一标识符'
    },
    // 评论的所属的用户的头像
    authorAvata: {
        type: Sequelize.STRING(50),
        allowNull: false,
        comment: '评论的所属作者头像的唯一标识符'
    },
    // 评论的创建时间
    createdAt: {
        type: Sequelize.DATE,
        allowNull: false,
        defaultValue: Sequelize.NOW,
        comment: '评论的创建时间'
    },
    // 评论的更新时间
    updatedAt: {
        type: Sequelize.DATE,
        allowNull: false,
        defaultValue: Sequelize.NOW,
        comment: '评论的更新时间'
    },
    // 评论的类型（新闻评论或者是帖子评论）
    type: {
        type: Sequelize.STRING(50),
        allowNull: false,
        comment: '评论的类型'
    },
    }, {
        // 指定表名
        tableName: 'comments'
});

// 添加新评论
app.post('/api/comments', async (req, res) => {
    console.log(req.query);
    const { content, author, authorAvata, articleId, type } = req.query
    // console.log({content, author, authorAvata, articleId, type})
    try {
        // 创建新的评论实例
        const comment = await Comment.create({ content, author, authorAvata, articleId, type });

        // 返回新创建的评论
        res.json(comment);
    } catch (error) {
        console.log(error);
        res.status(500).json({ error: '无法添加新评论' });
    }
});

// 删除指定评论
// app.delete('/api/comments/:id', async (req, res) => {
//     const { id } = req.query;

//     try {
//         // 查询指定评论
//         const comment = await Comment.findByPk(id);

//     if (!comment) {
//         return res.status(404).json({ error: '评论不存在' });
//     }

//         // 删除指定评论
//         await comment.destroy();

//         // 返回删除成功的消息
//         res.json({ message: '评论删除成功' });
//     } catch (error) {
//         console.log(error);
//         res.status(500).json({ error: '无法删除评论' });
//     }
// });

// 获取某篇文章下的所有评论
app.get('/api/comments', async (req, res) => {
    const { articleId } = req.query;
    try {
        // 查询条件
        const where = {};
        if (articleId) {
            where.articleId = articleId;
            where.type = 'news'
        }
        // 查询数据
        const comments = await Comment.findAll({
        where,
            order: [['createdAt', 'DESC']],
        });
        res.send({ success: true, data: comments });
    } catch (error) {
        console.error(error);
        res.send({ success: false, message: '获取评论列表失败' });
    }
});

/* ===================================================================*/ 
// 帖子创建模板
const Post =  sequelize.define('Post',{
    // 帖子的唯一标识符
    id: {
        type: Sequelize.INTEGER,
        allowNull: false,
        primaryKey: true,
        autoIncrement: true,
        comment: '帖子的唯一标识符'
    },
    // 帖子的内容
    content: {
        type: Sequelize.STRING(1000),
        allowNull: false,
        comment: '帖子的内容'
    },
    img: {
        type: Sequelize.STRING(255),
        allowNull: false,
        comment: '帖子的图片'
    },
    // 帖子的作者
    author: {
        type: Sequelize.STRING(50),
        allowNull: false,
        comment: '帖子的作者'
    },
    // 帖子的所属的用户的头像
    authorAvata: {
        type: Sequelize.STRING(50),
        allowNull: false,
        comment: '帖子的所属作者头像的唯一标识符'
    },
    // 帖子的创建时间
    createdAt: {
        type: Sequelize.DATE,
        allowNull: false,
        defaultValue: Sequelize.NOW,
        comment: '帖子的创建时间'
    },
    },{
        // 指定表名
        tableName: 'post'
})

// 添加新帖子
// app.post('/api/posts', async (req, res) => {
//     console.log(req.query);
//     const { content, img, author, authorAvata } = req.query
//     console.log({content, img, author, authorAvata})
//     try {
//         // 创建新的评论实例
//         const post = await Post.create({ content, img, author, authorAvata });

//         // 返回新创建的评论
//         res.json(post);
//     } catch (error) {
//         console.log(error);
//         res.status(500).json({ error: '无法发表帖子' });
//     }
// });

// 获取所有帖子
app.get('/api/posts', async (req, res) => {
    try {
        const posts = await Post.findAll({
            order: [['createdAt', 'DESC']]
        });
        res.json(posts);
    } catch (err) {
        console.error(err);
        res.status(500).json({ message: '服务器错误' });
    }
});

/* === 上传帖子 =========================================*/

const multer = require('multer');
const fs = require('fs');
const path = require('path');

// 保证上传目录存在
const directory = './uploads';

if (!fs.existsSync(directory)){
    fs.mkdirSync(directory);
}

// 设置存储引擎
const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        // destination函数用于设置文件上传后的存储目录，这里设置为uploads/，表示上传的文件将存储在项目根目录下的uploads文件夹中。
        cb(null, 'uploads/')
    },
    filename: function (req, file, cb) {
        // 使用Date.now()生成一个时间戳作为文件名的前缀，再加上上传文件的原始扩展名（使用path.extname获取），保证上传的文件名具有唯一性。
        cb(null, Date.now() + path.extname(file.originalname))
    }
})

// 创建multer实例
const upload = multer({ storage: storage });

// 发布帖子
app.post('/api/posts', upload.single('image'), async (req, res) => {
    try {
        console.log(req.query);
        console.log(req.query.content);
        const post = await Post.create({
            author: req.query.author,
            content: req.query.content,
            authorAvata: req.query.authorAvata,
            img: req.query.image
        });
        res.send({ success: true, data: post });
    } catch (error) {
        console.error(error);
        res.send({ success: false, message: '发布帖子失败' });
    }
})

/* ============================================================================*/


app.use('/api',require('./routers/api/index'))
app.use('/api',require('./routers/api/index/banner'))   // 首页轮播图
app.use('/api',require('./routers/api/index/indexHotShow1'))
app.use('/api',require('./routers/api/index/indexHotShow2')) // 首页热展
app.use('/api',require('./routers/api/index/indexArtExhibition1'))

// 分类-组件接口
app.use('/api',require('./routers/api/class/classStyle'))   // 风格
app.use('/api',require('./routers/api/class/classTheme'))   // 主题
app.use('/api',require('./routers/api/class/classCountry')) // 国家
app.use('/api',require('./routers/api/class/classPainter')) // 画家

app.use('/api',require('./routers/api/user/login')) // 登录
app.use('/api',require('./routers/api/user/logout')) // 退出登录
app.use('/api',require('./routers/api/user/userinfo')) // 获取用户信息
app.use('/api',require('./routers/api/user/register')) // 注册
app.use('/api',require('./routers/api/index/indexSearch')) // 首页搜索
app.use('/api',require('./routers/api/workDetails')) // 画作详情


app.listen(port, () => {
    console.log('The server is started successfully. The port is 3000!')
})